package com.allwees.bs.core.modelbase.validate;

import java.util.ArrayList;
import java.util.List;

/**
 * 可校验数据的接口包括校验的定义和校验方法，当校验失败时，返回全部错误信息
 *
 * @author yangylsky
 */
public interface Validatable {
	/**
	 * 返回当前对象的所有待校验项
	 *
	 * @return
	 */
	default ValidateItem[] getValidateItems() {
		return new ValidateItem[0];
	}

	/**
	 * 校验数据是否有效，校验失败返回全部错误信息（错误信息包装在ValidateException里）
	 *
	 * @throws ValidateException（包括全部错误信息）
	 */
	default void validate() throws ValidateException {
		beforeValidate();

		validate(getValidateItems());

		afterValidate();
	}

	static void validate(ValidateItem[] validateItems) {
		boolean isError = false;
		List<String> errorMsgs = new ArrayList<>();
		for(ValidateItem item : validateItems) {
			if(item.isError()) {
				errorMsgs.add(item.getErrorMsg());
				isError = true;
			}
		}
		if(isError) {
			throw new ValidateException(errorMsgs);
		}
	}

	/**
	 * 校验前自动调用的处理
	 */
	default void beforeValidate() {
	}

	/**
	 * 校验通过后自动调用的处理
	 */
	default void afterValidate() {
	}
}
